// hdu2795
// 题意：给定一个h*w(h, w<=10^9)的屏幕，每一个消息占用一个大小为1*wi
//       的矩形，现在有n(<=200000)条消息要发布，每条消息都尽量选择
//       高的行（从h=1开始），然后选择该行最左边。如果没有位置放下
//       这条消息，那么输出-1, 否则输出该条消息所在的行。
//
// 题解：不错的题。首先题目理解下就是给定h个初始为w的数按顺序排列，
//       现在有n条消息按顺序要放，对于当前的这条消息总是找到地一个
//       大于它的数，消息就放在这行然后把数减去这条消息的长度。
//
//       h虽然很大，但是不会超过n。
//
//       这样我们可以先有一个O(n*log(n)^2)的算法，用线段数维护[1, h]
//       的最大值，然后对于每条消息，二分所在行再修改就行。
//       这个算法过不了，数组组数有40组。
//
//       我们总感觉而分有点浪费，因为线段树可以维护任意区间的最大值，
//       但是这题只需要[1, mid]这个区间的最大值就行。
//       其实线段树查询过程中一般先往左走再往右走，所以我们可以不用
//       二分，直接把查询和修改合并，先往左看最大值够不够，否则如果
//       右儿子够那肯定就在右区间，如果都不够大，肯定就是-1了。
//
//       还有要特别注意的是，h=1的时候，整个线段树只有一个叶子节点，
//       所以可以给线段树的区间加长，使得至少有一个内部节点，或者
//       在叶结点的地方也要特判是不是够放。
//
// run: $exec < input
#include <iostream>
#include <algorithm>

int const maxn = 200007;

struct node { int max; };

node tree[4 * maxn];

int h, w, n;

void push_up(int id)
{
	tree[id].max = std::max(tree[id * 2].max, tree[id * 2 + 1].max);
}

void build(int id, int l, int r)
{
	if (l == r) { tree[id].max = w; return; }
	int mid = (l + r) / 2;
	build(id * 2, l, mid);
	build(id * 2 + 1, mid + 1, r);
	push_up(id);
}

int update(int id, int l, int r, int w)
{
	if (l == r) {
		if (tree[id].max < w) return -1;
		tree[id].max -= w;
		return l;
	}
	int ret = -1, mid = (l + r) / 2;
	if (tree[id * 2].max >= w) ret = update(id * 2, l, mid, w);
	else if (tree[id * 2 + 1].max >= w) ret = update(id * 2 + 1, mid + 1, r, w);
	push_up(id);
	return ret;
}

int main()
{
	std::ios::sync_with_stdio(false);
	while (std::cin >> h >> w >> n) {
		h = std::min(h, n);
		build(1, 1, h);
		for (int i = 0, x; i < n; i++) {
			std::cin >> x;
			std::cout << update(1, 1, h, x) << '\n';
		}
	}
}

